home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGBLER / ASMCODE2.LZH / CLOSER.ASM < prev    next >
Assembly Source File  |  1984-03-04  |  5KB  |  145 lines

  1.          NAME      CLOSER
  2.          PAGE      55,132
  3.          TITLE     'CLOSER - SHOW BUG IN PC-DOS FUNCTION 10H'
  4. ;
  5. ; THIS PROGRAM DEMONSTRATES A SUBTLE BUT DANGEROUS BUG IN THE
  6. ; PC-DOS CLOSE FILE FUNCTION 10H.  IF A CLOSE REQUEST IS ISSUED
  7. ; USING A FILE CONTROL BLOCK THAT HAS NOT BEEN PREVIOUSLY
  8. ; ACTIVATED BY A SUCCESSFUL OPEN COMMAND, THE FILE'S LENGTH
  9. ; WILL BE TRUNCATED TO ZERO AND THE CLUSTERS PREVIOUSLY ASSIGNED
  10. ; TO THE FILE ARE LEFT FLOATING.
  11. ;
  12. ; RAY DUNCAN, NOVEMBER 1983
  13.  
  14. CR       EQU       0DH       ;ASCII CARRIAGE RETURN
  15. LF       EQU       0AH       ;ASCII LINE FEED
  16.  
  17. CSEG     SEGMENT   PARA PUBLIC 'CODE'
  18.  
  19.          ASSUME    CS:CSEG,DS:DATA,ES:DATA,SS:STACK
  20.  
  21. CLOSER   PROC      FAR
  22.          PUSH      DS        ;SAVE DS:0000 FOR FINAL
  23.          XOR       AX,AX     ;RETURN TO PC-DOS
  24.          PUSH      AX
  25.  
  26.          MOV       AX,DATA   ;MAKE OUR DATA AREA
  27.          MOV       DS,AX     ;ADDRESSABLE
  28.          MOV       ES,AX
  29.  
  30.                              ;NOW CREATE FILE QUACK.DAT
  31.          MOV       AH,16H
  32.          MOV       DX,OFFSET FCB
  33.          INT       21H
  34.          OR        AL,AL     ;CREATE SUCCESSFUL?
  35.          JNZ       CLOSER8   ;NO,JUMP
  36.          MOV       AH,9      ;YES,PRINT SUCCESS MESSAGE
  37.          MOV       DX,OFFSET MSG1
  38.          INT       21H
  39.  
  40.                              ;NOW SET THE RECORD LENGTH
  41.                              ;TO 1024 BYTES AND WRITE
  42.                              ;RANDOM DATA INTO THE
  43.                              ;FILE (USING DEFAULT DTA)
  44.          MOV       WORD PTR FCB+14,1024
  45.          MOV       AH,15H
  46.          MOV       DX,OFFSET FCB
  47.          INT       21H
  48.          OR        AL,AL     ;WAS WRITE SUCCESSFUL?
  49.          JNZ       CLOSER8   ;NO,JUMP
  50.          MOV       AH,9      ;YES,PRINT SUCCESS MESSAGE
  51.          MOV       DX,OFFSET MSG2
  52.          INT       21H
  53.  
  54.                              ;NOW CLOSE THE FILE SO THE
  55.                              ;DIRECTORY WILL BE UPDATED
  56.          MOV       AH,10H
  57.          MOV       DX,OFFSET FCB
  58.          INT       21H
  59.          OR        AL,AL     ;CLOSE OPERATION SUCCESSFUL?
  60.          JNZ       CLOSER8   ;NO,JUMP
  61.          MOV       AH,9      ;YES,PRINT SUCCESS MESSAGE
  62.          MOV       DX,OFFSET MSG3
  63.          INT       21H
  64.  
  65.                              ;NOW CLEAR OUT THE FILE CONTROL
  66.                              ;BLOCK EXCEPT FOR THE FILESPEC,
  67.                              ;AS THOUGH THE FILE HAD NEVER
  68.                              ;BEEN OPENED, AND THEN REQUEST
  69.                              ;ANOTHER CLOSE OPERATION.
  70.  
  71.          MOV       DI,OFFSET FCB+12
  72.          MOV       CX,25
  73.          XOR       AL,AL
  74.          CLD
  75.          REP STOSB           ;THIS ZEROS OUT THE FCB
  76.  
  77.          MOV       AH,10H    ;NOW CLOSE FILE AGAIN
  78.          MOV       DX,OFFSET FCB
  79.          INT       21H
  80.          OR        AL,AL     ;CHECK STATUS
  81.          JNZ       CLOSER8   ;BAD STATUS,JUMP
  82.  
  83.                              ;STATUS OK, PRINT FINAL
  84.                              ;MESSAGE TO INSPECT DIRECTORY
  85.          MOV       DX,OFFSET MSG4
  86.          JMP       CLOSER9
  87.  
  88. CLOSER8:                     ;COME HERE IF UNEXPECTED
  89.                              ;FAILURE OF DISK OPERATION
  90.          MOV       DX,OFFSET MSG5
  91.  
  92. CLOSER9:                     ;PRINT MESSAGE AND EXIT
  93.          MOV       AH,9
  94.          INT       21H
  95.  
  96.          RET                 ;FAR RETURN TO PC-DOS
  97.  
  98. CLOSER   ENDP
  99.  
  100. CSEG     ENDS
  101.  
  102.  
  103. STACK    SEGMENT   PARA STACK 'STACK'
  104.          DB        64 DUP (?)
  105. STACK    ENDS
  106.  
  107.  
  108. DATA     SEGMENT   PARA PUBLIC 'DATA'
  109.  
  110. MSG1     DB        CR,LF
  111.          DB        'FILE QUACK.DAT CREATED'
  112.          DB        CR,LF,'$'
  113.  
  114. MSG2     DB        CR,LF
  115.          DB        '1024 BYTES WRITTEN INTO QUACK.DAT'
  116.          DB        CR,LF,'$'
  117.  
  118. MSG3     DB        CR,LF
  119.          DB        'FILE QUACK.DAT CLOSED PROPERLY'
  120.          DB        CR,LF,'$'
  121.  
  122. MSG4     DB        CR,LF,LF
  123.          DB        'SECOND CLOSE OPERATION REQUESTED '
  124.          DB        'ON FILE QUACK.DAT'
  125.          DB        CR,LF
  126.          DB        'INSPECT LENGTH OF FILE QUACK.DAT '
  127.          DB        'ON DIRECTORY LISTING'
  128.          DB        CR,LF
  129.          DB        'THEN RUN CHKDSK WITH /F SWITCH TO '
  130.          DB        'RECOVER LOST DISK CLUSTERS'
  131.          DB        CR,LF,'$'
  132.  
  133. MSG5     DB        CR,LF
  134.          DB        'UNEXPECTED FAILURE OF DISK OPERATION'
  135.          DB        CR,LF,'$'
  136.  
  137.                              ;FILE CONTROL BLOCK
  138. FCB      DB        0         ;USE DEFAULT DRIVE
  139.          DB        'QUACK   DAT'
  140.          DB        25 DUP (0)
  141.  
  142. DATA     ENDS
  143.  
  144.          END       CLOSER
  145.